Lectura del dataset y su estructura

# leo el archivo ar_properties 
library(tidyverse) # libreria para data wrangling
datos1a <- read_csv("ar_properties.csv") # Acá completen con su propio PATH al archivo

── Column specification ──────────────────────────────────────────────────────────────────────
cols(
  .default = col_character(),
  start_date = col_date(format = ""),
  end_date = col_date(format = ""),
  created_on = col_date(format = ""),
  lat = col_double(),
  lon = col_double(),
  l6 = col_logical(),
  rooms = col_double(),
  bedrooms = col_double(),
  bathrooms = col_double(),
  surface_total = col_double(),
  surface_covered = col_double(),
  price = col_double()
)
ℹ Use `spec()` for the full column specifications.
datos1a # veo la base

Aplicando filtros

Se seleccionan aquellos registros que pertenecen a Argentina y Capital Federal, cuyo precio esta en dolares (USD), el tipo de propiedad corresponde a Departamento y el tipo de operacion sea Venta.

datos1b <- datos1a %>% 
                   # Me quedo con los que pertenecen a Argentina y Capital Federal
            filter(l1 == "Argentina", 
                   l2 == "Capital Federal", 
                   # cuyo precio este en dolares 
                   currency == "USD", 
                   # propiedad tipo Departamento
                   property_type %in% c("Departamento"),
                   # operaciones de venta
                   operation_type == "Venta",
                   # acoto por precio y superficie
                   between(surface_covered,11,5000),between(price,1000,2e6)) %>% select(id,l3,surface_covered,price,lat,lon,rooms,bathrooms,bedrooms) %>% na.omit() %>% mutate(pm2=precio/sup) %>% rename(precio=price,barrio=l3,sup=surface_covered,ambientes=rooms,baths=bathrooms,cuartos=bedrooms) %>% na.omit()
# chequeo si el filtro se refleja correctamente en mi nuevo dataset datos1b
datos1b 
attach(datos1b) # pongo las variables en memoria
The following objects are masked from datos1b (pos = 3):

    barrio, id, lat, lon, pm2, precio, sup

The following objects are masked from datos1b (pos = 4):

    barrio, id, lat, lon, pm2, precio, sup

The following objects are masked from datos1b (pos = 5):

    barrio, id, lat, lon, pm2, precio, sup

The following objects are masked from datos1b (pos = 6):

    barrio, id, lat, lon, pm2, precio, sup

The following objects are masked from datos1b (pos = 8):

    barrio, id, lat, lon, pm2, precio, sup

The following objects are masked from datos1b (pos = 14):

    barrio, id, lat, lon, pm2, precio, sup

Cargo las librerias basicas para trabajar con datos espaciales

library(terra)
library(sf)
#vignette(package = "sf")
#vignette("sf1",package = "sf")
library("leaflet")
library(tmap)
library(OpenStreetMap)

Datos Vectoriales

Cargo deptos como Puntos

deptos.sf
Simple feature collection with 27276 features and 11 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -58.53047 ymin: -34.69215 xmax: -58.357 ymax: -34.53613
CRS:           EPSG:4326

cargo calles de CABA

# cargo el shape de calles de CABA
calles.comp <- st_read("/home/andresfaral/Dropbox/Estadistica Espacial/callejero/")
Reading layer `callejero' from data source 
  `/home/andresfaral/Dropbox/Estadistica Espacial/callejero' using driver `ESRI Shapefile'
Simple feature collection with 30712 features and 29 fields
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: -58.53244 ymin: -34.70574 xmax: -58.34191 ymax: -34.52947
CRS:           4326
# me quedo con algunos features
calles<-calles.comp[,c("id","tipo_c","nom_mapa","long")]
plot(calles)

# selecciono solo las avenidas
avenidas<-calles[calles$tipo_c=="AVENIDA",]
plot(avenidas)

nombres.ave<-avenidas$nom_mapa
# av rivadavia 
cuales<-grep("RIVADAVIA",nombres.ave)
rivadavia<-avenidas[cuales,]
plot(rivadavia)

# largo de la ave rivadavia
sum(rivadavia$long)
[1] 16623.84
# geometria de la ave rivadavia
rivadavia.geo<-rivadavia$geometry
# grafico con leaflet de avenidas
leaflet(avenidas) %>% addTiles() %>% addPolylines()
# grafico con leaflet de Rivadavia
leaflet(rivadavia) %>% addTiles() %>% addPolylines()
NA

Carga de Barrios CABA

# cargo barrios
barrios.comp <- st_read("/home/andresfaral/Dropbox/Estadistica Espacial/barrios/")
Reading layer `barrios_badata_wgs84' from data source 
  `/home/andresfaral/Dropbox/Estadistica Espacial/barrios' using driver `ESRI Shapefile'
Simple feature collection with 48 features and 5 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
barrios.comp
Simple feature collection with 48 features and 5 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
First 10 features:
             BARRIO COMUNA PERIMETRO    AREA OBJETO                       geometry
1         CHACARITA     15  7724.853 3115707 BARRIO POLYGON ((-58.45282 -34.595...
2          PATERNAL     15  7087.513 2229829 BARRIO POLYGON ((-58.46558 -34.596...
3      VILLA CRESPO     15  8131.857 3615978 BARRIO POLYGON ((-58.42375 -34.597...
4  VILLA DEL PARQUE     11  7705.390 3399596 BARRIO POLYGON ((-58.49461 -34.614...
5           ALMAGRO      5  8537.901 4050752 BARRIO POLYGON ((-58.41287 -34.614...
6         CABALLITO      6 10990.964 6851029 BARRIO POLYGON ((-58.43061 -34.607...
7  VILLA SANTA RITA     11  5757.752 2153691 BARRIO POLYGON ((-58.48192 -34.624...
8      MONTE CASTRO     10  7361.036 2627481 BARRIO POLYGON ((-58.50349 -34.624...
9        VILLA REAL     10  5070.966 1334146 BARRIO POLYGON ((-58.52512 -34.614...
10           FLORES      7 15772.440 8590784 BARRIO POLYGON ((-58.46041 -34.656...
plot(barrios.comp)

# me quedo solo con feature de barrio
barrios<-barrios.comp[1]
barrios
Simple feature collection with 48 features and 1 field
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
First 10 features:
             BARRIO                       geometry
1         CHACARITA POLYGON ((-58.45282 -34.595...
2          PATERNAL POLYGON ((-58.46558 -34.596...
3      VILLA CRESPO POLYGON ((-58.42375 -34.597...
4  VILLA DEL PARQUE POLYGON ((-58.49461 -34.614...
5           ALMAGRO POLYGON ((-58.41287 -34.614...
6         CABALLITO POLYGON ((-58.43061 -34.607...
7  VILLA SANTA RITA POLYGON ((-58.48192 -34.624...
8      MONTE CASTRO POLYGON ((-58.50349 -34.624...
9        VILLA REAL POLYGON ((-58.52512 -34.614...
10           FLORES POLYGON ((-58.46041 -34.656...
plot(barrios)

# la geometria
barrios$geometry
Geometry set for 48 features 
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
First 5 geometries:
POLYGON ((-58.45282 -34.59599, -58.45366 -34.59...
POLYGON ((-58.46558 -34.59656, -58.46562 -34.59...
POLYGON ((-58.42375 -34.59783, -58.42495 -34.59...
POLYGON ((-58.49461 -34.61487, -58.49479 -34.61...
POLYGON ((-58.41287 -34.61412, -58.41282 -34.61...
class(barrios)
[1] "sf"         "data.frame"
plot(barrios[1:5,])

print(barrios.comp, n = 3)
Simple feature collection with 48 features and 5 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
First 3 features:
        BARRIO COMUNA PERIMETRO    AREA OBJETO                       geometry
1    CHACARITA     15  7724.853 3115707 BARRIO POLYGON ((-58.45282 -34.595...
2     PATERNAL     15  7087.513 2229829 BARRIO POLYGON ((-58.46558 -34.596...
3 VILLA CRESPO     15  8131.857 3615978 BARRIO POLYGON ((-58.42375 -34.597...
# union de barrios
union._barrios<-st_union(barrios)
union._barrios
Geometry set for 1 feature 
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
POLYGON ((-58.35468 -34.62922, -58.35488 -34.62...
plot(union._barrios)

# grafico con leaflet
leaflet(barrios) %>% addTiles() %>% addPolygons()

Carga de Comunas CABA

comunas.comp <- st_read("/home/andresfaral/Dropbox/Estadistica Espacial/comunas/")
Reading layer `comunas_wgs84' from data source 
  `/home/andresfaral/Dropbox/Estadistica Espacial/comunas' using driver `ESRI Shapefile'
Simple feature collection with 15 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
comunas.comp
Simple feature collection with 15 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
First 10 features:
   ID         OBJETO COMUNAS
1   1 LIMITE COMUNAL       2
2   3 LIMITE COMUNAL       6
3   6 LIMITE COMUNAL      10
4   7 LIMITE COMUNAL      11
5   8 LIMITE COMUNAL      12
6   9 LIMITE COMUNAL      14
7  11 LIMITE COMUNAL      15
8  15 LIMITE COMUNAL      13
9  13 LIMITE COMUNAL       4
10  2 LIMITE COMUNAL       5
                                                                           BARRIOS PERIMETRO
1                                                                         RECOLETA  21452.84
2                                                                        CABALLITO  10990.96
3  FLORESTA - MONTE CASTRO - VELEZ SARSFIELD - VERSALLES - VILLA LURO - VILLA REAL  18332.04
4          VILLA DEL PARQUE - VILLA  DEVOTO - VILLA GRAL. MITRE - VILLA SANTA RITA  19987.70
5                            COGHLAN - SAAVEDRA - VILLA PUEYRREDON - VILLA URQUIZA  17232.19
6                                                                          PALERMO  22126.53
7  AGRONOMIA - CHACARITA -  PARQUE CHAS -  PATERNAL - VILLA CRESPO - VILLA ORTUZAR  17832.59
8                                                    BELGRANO - COLEGIALES - NUÑEZ  26198.83
9                               BARRACAS - BOCA - NUEVA POMPEYA - PARQUE PATRICIOS  35423.28
10                                                                 ALMAGRO - BOEDO  12323.43
       AREA                       geometry
1   6317265 MULTIPOLYGON (((-58.38 -34....
2   6851029 MULTIPOLYGON (((-58.43061 -...
3  12656557 MULTIPOLYGON (((-58.48834 -...
4  14120042 MULTIPOLYGON (((-58.49838 -...
5  15570927 MULTIPOLYGON (((-58.50331 -...
6  15845871 MULTIPOLYGON (((-58.42676 -...
7  14322897 MULTIPOLYGON (((-58.42602 -...
8  14713213 MULTIPOLYGON (((-58.44033 -...
9  21684645 MULTIPOLYGON (((-58.38864 -...
10  6660603 MULTIPOLYGON (((-58.43333 -...
plot(comunas.comp)

comunas<-comunas.comp[1]
plot(comunas)

Grafico de deptos, avenidas, comunas y barrios

# todo
leaflet() %>% addTiles() %>% addPolygons(data=barrios,color = "green") %>% addPolygons(data=comunas,color = "red") %>% addCircles(data=deptos.sf,radius=0.01) %>% addPolylines(data=avenidas,color = "black")
# un poco
leaflet() %>% addTiles() %>% addPolygons(data=barrios,color = "green") %>% addPolygons(data=comunas,color = "red") %>% addCircles(data=deptos.sf[1:1000,],radius=0.01) %>% addPolylines(data=rivadavia,color = "black")

# barrios with ggplot
ggplot() + geom_sf(data = deptos.sf, size = 0.3,color="grey") + geom_sf(data = barrios, aes(fill = BARRIO), alpha = 0.5) + geom_sf(data=rivadavia)

# comunas with ggplot
ggplot() + geom_sf(data = deptos.sf, size = 0.3,color="grey") + geom_sf(data=comunas.comp, aes(fill = COMUNAS), alpha = 0.5) + geom_sf(data=rivadavia)

Manipulacion y Operacion con objetos espaciales

Operadores binarios o binary predicates

Que Comuna incluye a Versalles ?

#
sf::sf_use_s2(FALSE)
Spherical geometry (s2) switched off
vers<-barrios[barrios$BARRIO=="VERSALLES",]
com10<-comunas.comp[comunas.comp$COMUNAS==10,]
plot(com10$geometry)
plot(vers$geometry,add=T,col="green")

# esta versalles en la comuna 10 ?
st_contains(com10,vers,sparse = FALSE)
although coordinates are longitude/latitude, st_contains assumes that they are planar
     [,1]
[1,] TRUE
# que barrios estan en que comunas
test1 <- st_intersects(comunas.comp,barrios,sparse = FALSE)
although coordinates are longitude/latitude, st_intersects assumes that they are planar
test1
       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12] [,13] [,14]
 [1,] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [2,] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE
 [3,] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [4,] FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [6,]  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [7,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [8,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
[10,] FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
[11,] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE
[12,] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
[13,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
[14,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
[15,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE
      [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28]
 [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
 [3,]  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
 [5,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE
 [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
 [8,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
 [9,] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10,] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
[11,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
[12,] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
[13,]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[14,] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[15,] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
      [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40] [,41] [,42]
 [1,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [2,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE
 [5,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE
 [6,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [7,]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE
 [8,]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [9,] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
[10,] FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[11,] FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[12,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
[13,] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE
[14,] FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[15,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
      [,43] [,44] [,45] [,46] [,47] [,48]
 [1,]  TRUE FALSE  TRUE  TRUE FALSE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] FALSE FALSE FALSE FALSE FALSE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE
 [5,] FALSE  TRUE FALSE FALSE  TRUE FALSE
 [6,] FALSE  TRUE  TRUE FALSE FALSE FALSE
 [7,] FALSE  TRUE FALSE FALSE FALSE FALSE
 [8,] FALSE  TRUE FALSE FALSE  TRUE FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE  TRUE
[10,] FALSE FALSE  TRUE FALSE FALSE FALSE
[11,] FALSE FALSE FALSE FALSE FALSE FALSE
[12,]  TRUE FALSE  TRUE FALSE FALSE FALSE
[13,] FALSE FALSE FALSE FALSE FALSE FALSE
[14,] FALSE FALSE FALSE FALSE FALSE FALSE
[15,]  TRUE FALSE  TRUE  TRUE FALSE  TRUE

Que deptos caen en versalles ?

test2 <- st_within(deptos.sf,vers,sparse = FALSE)
although coordinates are longitude/latitude, st_within assumes that they are planar
sum(test2)
[1] 25
plot(com10$geometry)
plot(vers$geometry,add=T,col="green")
plot(deptos.sf$geometry[test2],add=T,col="blue")

Que deptos estan a menos de 100 metros de Rivadavia

test3 <- st_is_within_distance(deptos.sf,rivadavia,dist = 500,sparse = FALSE)
dim(test3)
[1] 27276   169
class(test3)
[1] "matrix"
test3[1:10,1:6]
       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
 [1,] FALSE FALSE FALSE FALSE FALSE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] FALSE FALSE FALSE FALSE FALSE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE
 [5,] FALSE FALSE FALSE FALSE FALSE FALSE
 [6,] FALSE FALSE FALSE FALSE FALSE FALSE
 [7,] FALSE FALSE FALSE FALSE FALSE FALSE
 [8,] FALSE FALSE FALSE FALSE FALSE FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE FALSE
[10,] FALSE FALSE FALSE FALSE FALSE FALSE
cuales.deptos<-apply(test3,1,sum)
sum(cuales>0)
[1] 169
length(cuales.deptos)
[1] 27276
ggplot() + geom_sf(data = deptos.sf, size = 0.3,color="grey") + geom_sf(data = deptos.sf[cuales.deptos>0,], size = 0.5,color="blue") + geom_sf(data=rivadavia)

Combinacion de features

# uniendo tramos de rivadavia
rivadavia.unida<-st_combine(rivadavia)
rivadavia.unida
Geometry set for 1 feature 
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: -58.52928 ymin: -34.63935 xmax: -58.37038 ymax: -34.6072
CRS:           4326
MULTILINESTRING ((-58.47565 -34.63232, -58.4767...
ggplot() + geom_sf(data=comunas.comp, aes(fill = COMUNAS), alpha = 0.5) + geom_sf(data=rivadavia)


ggplot() + geom_sf(data=comunas.comp, aes(fill = COMUNAS), alpha = 0.5) + geom_sf(data=rivadavia.unida)


# combinando barrios
barrios.unidos<-st_combine(barrios)
barrios.unidos
Geometry set for 1 feature 
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
MULTIPOLYGON (((-58.45282 -34.59599, -58.45366 ...
plot(barrios.unidos)

Que avenidas cortan Rivadavia

# Que avenidas cortan rivadavia
NoRivadavia<-avenidas[avenidas$nom_mapa!="AV. RIVADAVIA",]
test4<-st_intersects(NoRivadavia,rivadavia,sparse = FALSE)
although coordinates are longitude/latitude, st_intersects assumes that they are planar
dim(test4)
[1] 6589  169
cuales.cortan<-apply(test4,1,sum)
nombres.cortan<-NoRivadavia$nom_mapa[cuales.cortan>0]
ggplot() + geom_sf(data=NoRivadavia[NoRivadavia$nom_mapa%in%nombres.cortan,],color="blue")  + geom_sf(data=rivadavia,color="red")

Que avenidas estan cerca Rivadavia

# Que avenidas cortan rivadavia
NoRivadavia<-avenidas[avenidas$nom_mapa!="AV. RIVADAVIA",]
test7<-st_is_within_distance(NoRivadavia,rivadavia,dist=1000,sparse = FALSE)
dim(test7)
[1] 6589  169
cuales.cortan<-apply(test7,1,sum)
nombres.cortan<-NoRivadavia$nom_mapa[cuales.cortan>0]
ggplot() + geom_sf(data=NoRivadavia[NoRivadavia$nom_mapa%in%nombres.cortan,],color="blue")  + geom_sf(data=rivadavia,color="red")

Que avenidas hay en Caballito

test5<-st_intersects(barrios[barrios$BARRIO=="CABALLITO",],avenidas,sparse = FALSE)
although coordinates are longitude/latitude, st_intersects assumes that they are planar
dim(test5)
[1]    1 6758
test5<-as.numeric(test5)
head(test5)
[1] 0 0 0 0 0 0
ggplot() + geom_sf(data=avenidas[test5>0,],color="blue")  + geom_sf(data = barrios[barrios$BARRIO=="CABALLITO",], aes(fill = BARRIO), alpha = 0.5)

Que barrios son contiguos a Caballito ?

# falla al norte
test6<-st_touches(barrios,barrios[barrios$BARRIO=="CABALLITO",],sparse = FALSE)
although coordinates are longitude/latitude, st_touches assumes that they are planar
# funciona ok
test6<-st_is_within_distance(barrios,barrios[barrios$BARRIO=="CABALLITO",],dist=100,sparse = FALSE)
dim(test6)
[1] 48  1
test6<-as.numeric(test6)
head(test6)
[1] 0 1 1 0 1 1
ggplot() + geom_sf(data = barrios[barrios$BARRIO=="CABALLITO",], aes(fill = BARRIO), alpha = 0.5)  + geom_sf(data = barrios[test6>0,], aes(fill = BARRIO), alpha = 0.5)

Que deptos estan sobre avenidas ? LENTO !!!!

# test8 <- st_is_within_distance(deptos.sf,avenidas,dist = 10,sparse = FALSE)
# dim(test8)
# cuales.deptos<-apply(test8,1,sum)
# sum(cuales.deptos>0)
# ggplot() + geom_sf(data = deptos.sf, size = 0.3,color="grey") + geom_sf(data = deptos.sf[cuales.deptos>0,], size = 0.5,color="blue") 

Cuantos deptos hay en cada barrio ? graficos con tmap

require(tmap)
deptos_in_barrios <- st_join(deptos.sf, barrios, join = st_within)
although coordinates are longitude/latitude, st_within assumes that they are planar
deptos_in_barrios
Simple feature collection with 27276 features and 12 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -58.53047 ymin: -34.69215 xmax: -58.357 ymax: -34.53613
CRS:           EPSG:4326
deptos_barrios_count <- count(as_tibble(deptos_in_barrios), BARRIO)
deptos_barrios_count
barrios_con_deptos <- left_join(barrios, deptos_barrios_count)
Joining, by = "BARRIO"
barrios_con_deptos
Simple feature collection with 48 features and 2 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
First 10 features:
             BARRIO    n                       geometry
1         CHACARITA  359 POLYGON ((-58.45282 -34.595...
2          PATERNAL  164 POLYGON ((-58.46558 -34.596...
3      VILLA CRESPO 2190 POLYGON ((-58.42375 -34.597...
4  VILLA DEL PARQUE  260 POLYGON ((-58.49461 -34.614...
5           ALMAGRO 2707 POLYGON ((-58.41287 -34.614...
6         CABALLITO 1966 POLYGON ((-58.43061 -34.607...
7  VILLA SANTA RITA  180 POLYGON ((-58.48192 -34.624...
8      MONTE CASTRO  188 POLYGON ((-58.50349 -34.624...
9        VILLA REAL   33 POLYGON ((-58.52512 -34.614...
10           FLORES  712 POLYGON ((-58.46041 -34.656...
tmap_mode("view")
tmap mode set to interactive viewing
tm_shape(barrios_con_deptos) +
  tm_fill(
    col = "n",
    palette = "Greens",
    style = "cont",
    contrast = c(0.1, 1),
    title = "Deptos por Barrio",
    id = "boro_ct2010",
    showNA = FALSE,
    alpha = 0.8) +
  tm_borders(col = "darkgray", lwd = 0.7)

Calculando la Capsula Convexa de los deptos

# solo los deptos
ggplot() + geom_sf(data=deptos.sf,size=0.1)

deptos.sf.unidos<-st_union(deptos.sf)
although coordinates are longitude/latitude, st_union assumes that they are planar
capsula<-st_convex_hull(deptos.sf.unidos)
capsula
Geometry set for 1 feature 
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53047 ymin: -34.69215 xmax: -58.357 ymax: -34.53613
CRS:           EPSG:4326
POLYGON ((-58.46401 -34.69215, -58.46972 -34.69...
ggplot()  + geom_sf(data=capsula,color="blue") + geom_sf(data=deptos.sf,size=0.1)

Calculemos las areas de los barrios

barrios
barrios2 <- barrios %>% mutate(AREA=st_area(barrios)) %>% arrange(-AREA)# agrego el area

Distancia entre barrios

barrios2
Simple feature collection with 48 features and 2 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
CRS:           4326
First 10 features:
          BARRIO           AREA                       geometry
1        PALERMO 15845872 [m^2] POLYGON ((-58.42676 -34.552...
2   VILLA LUGANO  9296146 [m^2] POLYGON ((-58.46571 -34.659...
3  VILLA SOLDATI  8688167 [m^2] POLYGON ((-58.44913 -34.651...
4         FLORES  8590788 [m^2] POLYGON ((-58.46041 -34.656...
5       BELGRANO  7999243 [m^2] POLYGON ((-58.45057 -34.535...
6       BARRACAS  7953447 [m^2] POLYGON ((-58.37034 -34.632...
7      MATADEROS  7398180 [m^2] POLYGON ((-58.50252 -34.674...
8      CABALLITO  6851031 [m^2] POLYGON ((-58.43061 -34.607...
9   VILLA DEVOTO  6404480 [m^2] POLYGON ((-58.50831 -34.613...
10      RECOLETA  6317261 [m^2] POLYGON ((-58.38 -34.57002,...
st_distance(barrios[barrios$BARRIO=="BELGRANO",],barrios[barrios$BARRIO=="FLORES",])
Units: [m]
         [,1]
[1,] 4327.646
st_distance(barrios[barrios$BARRIO=="CABALLITO",],barrios[barrios$BARRIO=="FLORES",])
Units: [m]
     [,1]
[1,]    0
distan<-st_nearest_points(barrios[barrios$BARRIO=="BELGRANO",],barrios[barrios$BARRIO=="FLORES",])
although coordinates are longitude/latitude, st_nearest_points assumes that they are planar
ggplot() + geom_sf(data = barrios, alpha = 0.5) + geom_sf(data = barrios[barrios$BARRIO=="FLORES",], aes(fill = BARRIO)) + geom_sf(data = barrios[barrios$BARRIO=="BELGRANO",], aes(fill = BARRIO)) + geom_sf(data=distan,col="blue")

Analisis de Espacio Verde Publico

Cual es el barrio con mas Espacio Verde ?

Estaciones de Subte

Calculemos la distancia de cada depto a la estacion de subte mas cercana

deptos.sf
Simple feature collection with 27276 features and 11 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -58.53047 ymin: -34.69215 xmax: -58.357 ymax: -34.53613
CRS:           EPSG:4326

Moelado del precio de los Depaertamentos

Moelo lineal basico

LS0tCnRpdGxlOiAiRXN0YWRpc3RpY2EgRXNwYWNpYWwgQXBsaWNhZGEiCmF1dGhvcjogIkFuZHJlcyBGYXJhbGwiCmRhdGU6ICIxOCBkZSBBZ29zdG8gZGUgMjAyMSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBsdW1lbgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCnN1YnRpdGxlOiBFamVtcGxpZmljYWNpb24gY29uIGxhIGJhc2UgZGUgUHJvcGVyYXRpCi0tLQoKCgojIyMgIExlY3R1cmEgZGVsIGRhdGFzZXQgeSBzdSBlc3RydWN0dXJhCgpgYGB7cn0KIyBsZW8gZWwgYXJjaGl2byBhcl9wcm9wZXJ0aWVzIApsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBsaWJyZXJpYSBwYXJhIGRhdGEgd3JhbmdsaW5nCmRhdG9zMWEgPC0gcmVhZF9jc3YoImFyX3Byb3BlcnRpZXMuY3N2IikgIyBBY8OhIGNvbXBsZXRlbiBjb24gc3UgcHJvcGlvIFBBVEggYWwgYXJjaGl2bwpkYXRvczFhICMgdmVvIGxhIGJhc2UKYGBgCgojIyMgQXBsaWNhbmRvIGZpbHRyb3MKClNlIHNlbGVjY2lvbmFuIGFxdWVsbG9zIHJlZ2lzdHJvcyBxdWUgcGVydGVuZWNlbiBhIEFyZ2VudGluYSB5IENhcGl0YWwgRmVkZXJhbCwgY3V5byBwcmVjaW8gZXN0YSBlbiBkb2xhcmVzIChVU0QpLCBlbCB0aXBvIGRlIHByb3BpZWRhZCBjb3JyZXNwb25kZSBhIERlcGFydGFtZW50byB5IGVsIHRpcG8gZGUgb3BlcmFjaW9uIHNlYSBWZW50YS4gCgpgYGB7cn0KZGF0b3MxYiA8LSBkYXRvczFhICU+JSAKICAgICAgICAgICAgICAgICAgICMgTWUgcXVlZG8gY29uIGxvcyBxdWUgcGVydGVuZWNlbiBhIEFyZ2VudGluYSB5IENhcGl0YWwgRmVkZXJhbAogICAgICAgICAgICBmaWx0ZXIobDEgPT0gIkFyZ2VudGluYSIsIAogICAgICAgICAgICAgICAgICAgbDIgPT0gIkNhcGl0YWwgRmVkZXJhbCIsIAogICAgICAgICAgICAgICAgICAgIyBjdXlvIHByZWNpbyBlc3RlIGVuIGRvbGFyZXMgCiAgICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9PSAiVVNEIiwgCiAgICAgICAgICAgICAgICAgICAjIHByb3BpZWRhZCB0aXBvIERlcGFydGFtZW50bwogICAgICAgICAgICAgICAgICAgcHJvcGVydHlfdHlwZSAlaW4lIGMoIkRlcGFydGFtZW50byIpLAogICAgICAgICAgICAgICAgICAgIyBvcGVyYWNpb25lcyBkZSB2ZW50YQogICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uX3R5cGUgPT0gIlZlbnRhIiwKICAgICAgICAgICAgICAgICAgICMgYWNvdG8gcG9yIHByZWNpbyB5IHN1cGVyZmljaWUKICAgICAgICAgICAgICAgICAgIGJldHdlZW4oc3VyZmFjZV9jb3ZlcmVkLDExLDUwMDApLGJldHdlZW4ocHJpY2UsMTAwMCwyZTYpKSAlPiUgc2VsZWN0KGlkLGwzLHN1cmZhY2VfY292ZXJlZCxwcmljZSxsYXQsbG9uLHJvb21zLGJhdGhyb29tcyxiZWRyb29tcykgJT4lIG5hLm9taXQoKSAlPiUgbXV0YXRlKHBtMj1wcmVjaW8vc3VwKSAlPiUgcmVuYW1lKHByZWNpbz1wcmljZSxiYXJyaW89bDMsc3VwPXN1cmZhY2VfY292ZXJlZCxhbWJpZW50ZXM9cm9vbXMsYmF0aHM9YmF0aHJvb21zLGN1YXJ0b3M9YmVkcm9vbXMpICU+JSBuYS5vbWl0KCkKIyBjaGVxdWVvIHNpIGVsIGZpbHRybyBzZSByZWZsZWphIGNvcnJlY3RhbWVudGUgZW4gbWkgbnVldm8gZGF0YXNldCBkYXRvczFiCmRhdG9zMWIgCmF0dGFjaChkYXRvczFiKSAjIHBvbmdvIGxhcyB2YXJpYWJsZXMgZW4gbWVtb3JpYQpgYGAKCkNhcmdvIGxhcyBsaWJyZXJpYXMgYmFzaWNhcyBwYXJhIHRyYWJhamFyIGNvbiBkYXRvcyBlc3BhY2lhbGVzCgpgYGB7cn0KbGlicmFyeSh0ZXJyYSkKbGlicmFyeShzZikKI3ZpZ25ldHRlKHBhY2thZ2UgPSAic2YiKQojdmlnbmV0dGUoInNmMSIscGFja2FnZSA9ICJzZiIpCmxpYnJhcnkoImxlYWZsZXQiKQpsaWJyYXJ5KHRtYXApCmxpYnJhcnkoT3BlblN0cmVldE1hcCkKYGBgCgojIyMgRGF0b3MgVmVjdG9yaWFsZXMKCiMjIENhcmdvIGRlcHRvcyBjb21vIFB1bnRvcwoKYGBge3J9CiMgdHJhbnNmb3JtbyBlbCBkdGFzZXQgYSBzZiwgY29uIHByb3llY2Npb24gRVBTRyA0MzI2LCBlcXVpdmFsZW50ZSBhIFdHUzg0CmRlcHRvcy5zZiA8LSBkYXRvczFiICU+JSBzdF9hc19zZihjb29yZHMgPSBjKCJsb24iLCAibGF0IiksIGNycyA9IDQzMjYpCmRlcHRvcy5zZgpjbGFzcyhkZXB0b3Muc2YpCiMgVmVyc2lvbiBhbHRlcm5hdGl2YSB1c2FuZG8gdGVycmEKI2xvbmxhdCA8LSBjYmluZChkYXRvczFiJGxvbiwgZGF0b3MxYiRsYXQpCiNkZiA8LSBkYXRhLmZyYW1lKElEPWRhdG9zMWIkaWQsIGRhdG9zMWIkc3VwKQojY3JkcmVmIDwtICIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIKI2RlcHRvcyA8LSB2ZWN0KGxvbmxhdCwgYXR0cz1kZiwgY3JzPWNyZHJlZikgIyB3aXRoIHRlcnJhCiNkZXB0b3Muc2YgPC0gc2Y6OnN0X2FzX3NmKGRlcHRvcykgIyBjb252ZXJzaW9uIHRvIHNmCiNwbG90KHB0cykKIyBncmFmaWNvIApwbG90KGRlcHRvcy5zZikKcGxvdChkZXB0b3Muc2ZbLCJsMyJdKSAjIHNvbG8gZWwgY2FtcG8gbDMKIyBjb24gbGVhZmxldApsZWFmbGV0KGRlcHRvcy5zZikgJT4lIGFkZFRpbGVzKCkgJT4lIGFkZENpcmNsZU1hcmtlcnMocmFkaXVzPTAuMikKIyB3aXRoIGdncGxvdApnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IGRlcHRvcy5zZiwgc2l6ZSA9IDAuMykKIyBjb24gdG1hcAp0bWFwX21vZGUoJ3ZpZXcnKQpxdG0oZGVwdG9zLnNmLCBzdHlsZSA9ICJuYXR1cmFsIikKYGBgCgojIyBjYXJnbyBjYWxsZXMgZGUgQ0FCQQoKCmBgYHtyfQojIGNhcmdvIGVsIHNoYXBlIGRlIGNhbGxlcyBkZSBDQUJBCmNhbGxlcy5jb21wIDwtIHN0X3JlYWQoIi9ob21lL2FuZHJlc2ZhcmFsL0Ryb3Bib3gvRXN0YWRpc3RpY2EgRXNwYWNpYWwvY2FsbGVqZXJvLyIpCiMgbWUgcXVlZG8gY29uIGFsZ3Vub3MgZmVhdHVyZXMKY2FsbGVzPC1jYWxsZXMuY29tcFssYygiaWQiLCJ0aXBvX2MiLCJub21fbWFwYSIsImxvbmciKV0KcGxvdChjYWxsZXMpCiMgc2VsZWNjaW9ubyBzb2xvIGxhcyBhdmVuaWRhcwphdmVuaWRhczwtY2FsbGVzW2NhbGxlcyR0aXBvX2M9PSJBVkVOSURBIixdCnBsb3QoYXZlbmlkYXMpCm5vbWJyZXMuYXZlPC1hdmVuaWRhcyRub21fbWFwYQojIGF2IHJpdmFkYXZpYSAKY3VhbGVzPC1ncmVwKCJSSVZBREFWSUEiLG5vbWJyZXMuYXZlKQpyaXZhZGF2aWE8LWF2ZW5pZGFzW2N1YWxlcyxdCnBsb3Qocml2YWRhdmlhKQojIGxhcmdvIGRlIGxhIGF2ZSByaXZhZGF2aWEKc3VtKHJpdmFkYXZpYSRsb25nKQojIGdlb21ldHJpYSBkZSBsYSBhdmUgcml2YWRhdmlhCnJpdmFkYXZpYS5nZW88LXJpdmFkYXZpYSRnZW9tZXRyeQojIGdyYWZpY28gY29uIGxlYWZsZXQgZGUgYXZlbmlkYXMKbGVhZmxldChhdmVuaWRhcykgJT4lIGFkZFRpbGVzKCkgJT4lIGFkZFBvbHlsaW5lcygpCiMgZ3JhZmljbyBjb24gbGVhZmxldCBkZSBSaXZhZGF2aWEKbGVhZmxldChyaXZhZGF2aWEpICU+JSBhZGRUaWxlcygpICU+JSBhZGRQb2x5bGluZXMoKQoKYGBgCgojIyBDYXJnYSBkZSBCYXJyaW9zIENBQkEKCmBgYHtyfQojIGNhcmdvIGJhcnJpb3MKYmFycmlvcy5jb21wIDwtIHN0X3JlYWQoIi9ob21lL2FuZHJlc2ZhcmFsL0Ryb3Bib3gvRXN0YWRpc3RpY2EgRXNwYWNpYWwvYmFycmlvcy8iKQpiYXJyaW9zLmNvbXAKcGxvdChiYXJyaW9zLmNvbXApCiMgbWUgcXVlZG8gc29sbyBjb24gZmVhdHVyZSBkZSBiYXJyaW8KYmFycmlvczwtYmFycmlvcy5jb21wWzFdCmJhcnJpb3MKcGxvdChiYXJyaW9zKQojIGxhIGdlb21ldHJpYQpiYXJyaW9zJGdlb21ldHJ5CmNsYXNzKGJhcnJpb3MpCnBsb3QoYmFycmlvc1sxOjUsXSkKcHJpbnQoYmFycmlvcy5jb21wLCBuID0gMykKIyB1bmlvbiBkZSBiYXJyaW9zCnVuaW9uLl9iYXJyaW9zPC1zdF91bmlvbihiYXJyaW9zKQp1bmlvbi5fYmFycmlvcwpwbG90KHVuaW9uLl9iYXJyaW9zKQojIGdyYWZpY28gY29uIGxlYWZsZXQKbGVhZmxldChiYXJyaW9zKSAlPiUgYWRkVGlsZXMoKSAlPiUgYWRkUG9seWdvbnMoKQpgYGAKCiMjIENhcmdhIGRlIENvbXVuYXMgQ0FCQQoKYGBge3J9CmNvbXVuYXMuY29tcCA8LSBzdF9yZWFkKCIvaG9tZS9hbmRyZXNmYXJhbC9Ecm9wYm94L0VzdGFkaXN0aWNhIEVzcGFjaWFsL2NvbXVuYXMvIikKY29tdW5hcy5jb21wCnBsb3QoY29tdW5hcy5jb21wKQpjb211bmFzPC1jb211bmFzLmNvbXBbMV0KcGxvdChjb211bmFzKQoKYGBgCgpHcmFmaWNvIGRlIGRlcHRvcywgYXZlbmlkYXMsIGNvbXVuYXMgeSBiYXJyaW9zCgpgYGB7cn0KIyB0b2RvCmxlYWZsZXQoKSAlPiUgYWRkVGlsZXMoKSAlPiUgYWRkUG9seWdvbnMoZGF0YT1iYXJyaW9zLGNvbG9yID0gImdyZWVuIikgJT4lIGFkZFBvbHlnb25zKGRhdGE9Y29tdW5hcyxjb2xvciA9ICJyZWQiKSAlPiUgYWRkQ2lyY2xlcyhkYXRhPWRlcHRvcy5zZixyYWRpdXM9MC4wMSkgJT4lIGFkZFBvbHlsaW5lcyhkYXRhPWF2ZW5pZGFzLGNvbG9yID0gImJsYWNrIikKIyB1biBwb2NvCmxlYWZsZXQoKSAlPiUgYWRkVGlsZXMoKSAlPiUgYWRkUG9seWdvbnMoZGF0YT1iYXJyaW9zLGNvbG9yID0gImdyZWVuIikgJT4lIGFkZFBvbHlnb25zKGRhdGE9Y29tdW5hcyxjb2xvciA9ICJyZWQiKSAlPiUgYWRkQ2lyY2xlcyhkYXRhPWRlcHRvcy5zZlsxOjEwMDAsXSxyYWRpdXM9MC4wMSkgJT4lIGFkZFBvbHlsaW5lcyhkYXRhPXJpdmFkYXZpYSxjb2xvciA9ICJibGFjayIpCgojIGJhcnJpb3Mgd2l0aCBnZ3Bsb3QKZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSBkZXB0b3Muc2YsIHNpemUgPSAwLjMsY29sb3I9ImdyZXkiKSArIGdlb21fc2YoZGF0YSA9IGJhcnJpb3MsIGFlcyhmaWxsID0gQkFSUklPKSwgYWxwaGEgPSAwLjUpICsgZ2VvbV9zZihkYXRhPXJpdmFkYXZpYSkKIyBjb211bmFzIHdpdGggZ2dwbG90CmdncGxvdCgpICsgZ2VvbV9zZihkYXRhID0gZGVwdG9zLnNmLCBzaXplID0gMC4zLGNvbG9yPSJncmV5IikgKyBnZW9tX3NmKGRhdGE9Y29tdW5hcy5jb21wLCBhZXMoZmlsbCA9IENPTVVOQVMpLCBhbHBoYSA9IDAuNSkgKyBnZW9tX3NmKGRhdGE9cml2YWRhdmlhKQoKYGBgCgoKIyMgTWFuaXB1bGFjaW9uIHkgT3BlcmFjaW9uIGNvbiBvYmpldG9zIGVzcGFjaWFsZXMKCiMgT3BlcmFkb3JlcyBiaW5hcmlvcyBvIGJpbmFyeSBwcmVkaWNhdGVzCgpRdWUgQ29tdW5hIGluY2x1eWUgYSBWZXJzYWxsZXMgPwoKYGBge3J9CiMKc2Y6OnNmX3VzZV9zMihGQUxTRSkKdmVyczwtYmFycmlvc1tiYXJyaW9zJEJBUlJJTz09IlZFUlNBTExFUyIsXQpjb20xMDwtY29tdW5hcy5jb21wW2NvbXVuYXMuY29tcCRDT01VTkFTPT0xMCxdCnBsb3QoY29tMTAkZ2VvbWV0cnkpCnBsb3QodmVycyRnZW9tZXRyeSxhZGQ9VCxjb2w9ImdyZWVuIikKIyBlc3RhIHZlcnNhbGxlcyBlbiBsYSBjb211bmEgMTAgPwpzdF9jb250YWlucyhjb20xMCx2ZXJzLHNwYXJzZSA9IEZBTFNFKQojIHF1ZSBiYXJyaW9zIGVzdGFuIGVuIHF1ZSBjb211bmFzCnRlc3QxIDwtIHN0X2ludGVyc2VjdHMoY29tdW5hcy5jb21wLGJhcnJpb3Msc3BhcnNlID0gRkFMU0UpCnRlc3QxCmBgYAoKUXVlIGRlcHRvcyBjYWVuIGVuIHZlcnNhbGxlcyA/CgoKYGBge3J9CnRlc3QyIDwtIHN0X3dpdGhpbihkZXB0b3Muc2YsdmVycyxzcGFyc2UgPSBGQUxTRSkKc3VtKHRlc3QyKQpwbG90KGNvbTEwJGdlb21ldHJ5KQpwbG90KHZlcnMkZ2VvbWV0cnksYWRkPVQsY29sPSJncmVlbiIpCnBsb3QoZGVwdG9zLnNmJGdlb21ldHJ5W3Rlc3QyXSxhZGQ9VCxjb2w9ImJsdWUiKQoKYGBgCgpRdWUgZGVwdG9zIGVzdGFuIGEgbWVub3MgZGUgMTAwIG1ldHJvcyBkZSBSaXZhZGF2aWEgCgpgYGB7cn0KdGVzdDMgPC0gc3RfaXNfd2l0aGluX2Rpc3RhbmNlKGRlcHRvcy5zZixyaXZhZGF2aWEsZGlzdCA9IDUwMCxzcGFyc2UgPSBGQUxTRSkKZGltKHRlc3QzKQpjbGFzcyh0ZXN0MykKdGVzdDNbMToxMCwxOjZdCmN1YWxlcy5kZXB0b3M8LWFwcGx5KHRlc3QzLDEsc3VtKQpzdW0oY3VhbGVzPjApCmxlbmd0aChjdWFsZXMuZGVwdG9zKQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IGRlcHRvcy5zZiwgc2l6ZSA9IDAuMyxjb2xvcj0iZ3JleSIpICsgZ2VvbV9zZihkYXRhID0gZGVwdG9zLnNmW2N1YWxlcy5kZXB0b3M+MCxdLCBzaXplID0gMC41LGNvbG9yPSJibHVlIikgKyBnZW9tX3NmKGRhdGE9cml2YWRhdmlhKQoKYGBgCgpDb21iaW5hY2lvbiBkZSBmZWF0dXJlcwoKYGBge3J9CiMgdW5pZW5kbyB0cmFtb3MgZGUgcml2YWRhdmlhCnJpdmFkYXZpYS51bmlkYTwtc3RfY29tYmluZShyaXZhZGF2aWEpCnJpdmFkYXZpYS51bmlkYQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YT1jb211bmFzLmNvbXAsIGFlcyhmaWxsID0gQ09NVU5BUyksIGFscGhhID0gMC41KSArIGdlb21fc2YoZGF0YT1yaXZhZGF2aWEpCgpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YT1jb211bmFzLmNvbXAsIGFlcyhmaWxsID0gQ09NVU5BUyksIGFscGhhID0gMC41KSArIGdlb21fc2YoZGF0YT1yaXZhZGF2aWEudW5pZGEpCgojIGNvbWJpbmFuZG8gYmFycmlvcwpiYXJyaW9zLnVuaWRvczwtc3RfY29tYmluZShiYXJyaW9zKQpiYXJyaW9zLnVuaWRvcwpwbG90KGJhcnJpb3MudW5pZG9zKQoKYGBgCgoKUXVlIGF2ZW5pZGFzIGNvcnRhbiBSaXZhZGF2aWEKCmBgYHtyfQojIFF1ZSBhdmVuaWRhcyBjb3J0YW4gcml2YWRhdmlhCk5vUml2YWRhdmlhPC1hdmVuaWRhc1thdmVuaWRhcyRub21fbWFwYSE9IkFWLiBSSVZBREFWSUEiLF0KdGVzdDQ8LXN0X2ludGVyc2VjdHMoTm9SaXZhZGF2aWEscml2YWRhdmlhLHNwYXJzZSA9IEZBTFNFKQpkaW0odGVzdDQpCmN1YWxlcy5jb3J0YW48LWFwcGx5KHRlc3Q0LDEsc3VtKQpub21icmVzLmNvcnRhbjwtTm9SaXZhZGF2aWEkbm9tX21hcGFbY3VhbGVzLmNvcnRhbj4wXQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YT1Ob1JpdmFkYXZpYVtOb1JpdmFkYXZpYSRub21fbWFwYSVpbiVub21icmVzLmNvcnRhbixdLGNvbG9yPSJibHVlIikgICsgZ2VvbV9zZihkYXRhPXJpdmFkYXZpYSxjb2xvcj0icmVkIikKCmBgYAoKUXVlIGF2ZW5pZGFzIGVzdGFuIGNlcmNhIFJpdmFkYXZpYQoKYGBge3J9CiMgUXVlIGF2ZW5pZGFzIGNvcnRhbiByaXZhZGF2aWEKTm9SaXZhZGF2aWE8LWF2ZW5pZGFzW2F2ZW5pZGFzJG5vbV9tYXBhIT0iQVYuIFJJVkFEQVZJQSIsXQp0ZXN0Nzwtc3RfaXNfd2l0aGluX2Rpc3RhbmNlKE5vUml2YWRhdmlhLHJpdmFkYXZpYSxkaXN0PTEwMDAsc3BhcnNlID0gRkFMU0UpCmRpbSh0ZXN0NykKY3VhbGVzLmNvcnRhbjwtYXBwbHkodGVzdDcsMSxzdW0pCm5vbWJyZXMuY29ydGFuPC1Ob1JpdmFkYXZpYSRub21fbWFwYVtjdWFsZXMuY29ydGFuPjBdCmdncGxvdCgpICsgZ2VvbV9zZihkYXRhPU5vUml2YWRhdmlhW05vUml2YWRhdmlhJG5vbV9tYXBhJWluJW5vbWJyZXMuY29ydGFuLF0sY29sb3I9ImJsdWUiKSAgKyBnZW9tX3NmKGRhdGE9cml2YWRhdmlhLGNvbG9yPSJyZWQiKQoKYGBgCgoKUXVlIGF2ZW5pZGFzIGhheSBlbiBDYWJhbGxpdG8KCmBgYHtyfQp0ZXN0NTwtc3RfaW50ZXJzZWN0cyhiYXJyaW9zW2JhcnJpb3MkQkFSUklPPT0iQ0FCQUxMSVRPIixdLGF2ZW5pZGFzLHNwYXJzZSA9IEZBTFNFKQpkaW0odGVzdDUpCnRlc3Q1PC1hcy5udW1lcmljKHRlc3Q1KQpoZWFkKHRlc3Q1KQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YT1hdmVuaWRhc1t0ZXN0NT4wLF0sY29sb3I9ImJsdWUiKSAgKyBnZW9tX3NmKGRhdGEgPSBiYXJyaW9zW2JhcnJpb3MkQkFSUklPPT0iQ0FCQUxMSVRPIixdLCBhZXMoZmlsbCA9IEJBUlJJTyksIGFscGhhID0gMC41KQoKYGBgCgoKUXVlIGJhcnJpb3Mgc29uIGNvbnRpZ3VvcyBhIENhYmFsbGl0byA/CgpgYGB7cn0KIyBmYWxsYSBhbCBub3J0ZQp0ZXN0Njwtc3RfdG91Y2hlcyhiYXJyaW9zLGJhcnJpb3NbYmFycmlvcyRCQVJSSU89PSJDQUJBTExJVE8iLF0sc3BhcnNlID0gRkFMU0UpCiMgZnVuY2lvbmEgb2sKdGVzdDY8LXN0X2lzX3dpdGhpbl9kaXN0YW5jZShiYXJyaW9zLGJhcnJpb3NbYmFycmlvcyRCQVJSSU89PSJDQUJBTExJVE8iLF0sZGlzdD0xMDAsc3BhcnNlID0gRkFMU0UpCmRpbSh0ZXN0NikKdGVzdDY8LWFzLm51bWVyaWModGVzdDYpCmhlYWQodGVzdDYpCmdncGxvdCgpICsgZ2VvbV9zZihkYXRhID0gYmFycmlvc1tiYXJyaW9zJEJBUlJJTz09IkNBQkFMTElUTyIsXSwgYWVzKGZpbGwgPSBCQVJSSU8pLCBhbHBoYSA9IDAuNSkgICsgZ2VvbV9zZihkYXRhID0gYmFycmlvc1t0ZXN0Nj4wLF0sIGFlcyhmaWxsID0gQkFSUklPKSwgYWxwaGEgPSAwLjUpCgpgYGAKCgpRdWUgZGVwdG9zIGVzdGFuIHNvYnJlIGF2ZW5pZGFzID8gTEVOVE8gISEhIQoKYGBge3J9CiMgdGVzdDggPC0gc3RfaXNfd2l0aGluX2Rpc3RhbmNlKGRlcHRvcy5zZixhdmVuaWRhcyxkaXN0ID0gMTAsc3BhcnNlID0gRkFMU0UpCiMgZGltKHRlc3Q4KQojIGN1YWxlcy5kZXB0b3M8LWFwcGx5KHRlc3Q4LDEsc3VtKQojIHN1bShjdWFsZXMuZGVwdG9zPjApCiMgZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSBkZXB0b3Muc2YsIHNpemUgPSAwLjMsY29sb3I9ImdyZXkiKSArIGdlb21fc2YoZGF0YSA9IGRlcHRvcy5zZltjdWFsZXMuZGVwdG9zPjAsXSwgc2l6ZSA9IDAuNSxjb2xvcj0iYmx1ZSIpIAoKYGBgCgpDdWFudG9zIGRlcHRvcyBoYXkgZW4gY2FkYSBiYXJyaW8gPwpncmFmaWNvcyBjb24gdG1hcAoKYGBge3J9CnJlcXVpcmUodG1hcCkKZGVwdG9zX2luX2JhcnJpb3MgPC0gc3Rfam9pbihkZXB0b3Muc2YsIGJhcnJpb3MsIGpvaW4gPSBzdF93aXRoaW4pCmRlcHRvc19pbl9iYXJyaW9zCmRlcHRvc19iYXJyaW9zX2NvdW50IDwtIGNvdW50KGFzX3RpYmJsZShkZXB0b3NfaW5fYmFycmlvcyksIEJBUlJJTykKZGVwdG9zX2JhcnJpb3NfY291bnQKYmFycmlvc19jb25fZGVwdG9zIDwtIGxlZnRfam9pbihiYXJyaW9zLCBkZXB0b3NfYmFycmlvc19jb3VudCkKYmFycmlvc19jb25fZGVwdG9zCgp0bWFwX21vZGUoInZpZXciKQp0bV9zaGFwZShiYXJyaW9zX2Nvbl9kZXB0b3MpICsKICB0bV9maWxsKAogICAgY29sID0gIm4iLAogICAgcGFsZXR0ZSA9ICJHcmVlbnMiLAogICAgc3R5bGUgPSAiY29udCIsCiAgICBjb250cmFzdCA9IGMoMC4xLCAxKSwKICAgIHRpdGxlID0gIkRlcHRvcyBwb3IgQmFycmlvIiwKICAgIGlkID0gImJvcm9fY3QyMDEwIiwKICAgIHNob3dOQSA9IEZBTFNFLAogICAgYWxwaGEgPSAwLjgpICsKICB0bV9ib3JkZXJzKGNvbCA9ICJkYXJrZ3JheSIsIGx3ZCA9IDAuNykKYGBgCgpDYWxjdWxhbmRvIGxhIENhcHN1bGEgQ29udmV4YSBkZSBsb3MgZGVwdG9zCgpgYGB7cn0KIyBzb2xvIGxvcyBkZXB0b3MKZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGE9ZGVwdG9zLnNmLHNpemU9MC4xKQpkZXB0b3Muc2YudW5pZG9zPC1zdF91bmlvbihkZXB0b3Muc2YpCmNhcHN1bGE8LXN0X2NvbnZleF9odWxsKGRlcHRvcy5zZi51bmlkb3MpCmNhcHN1bGEKZ2dwbG90KCkgICsgZ2VvbV9zZihkYXRhPWNhcHN1bGEsY29sb3I9ImJsdWUiKSArIGdlb21fc2YoZGF0YT1kZXB0b3Muc2Ysc2l6ZT0wLjEpCgpgYGAKCkNhbGN1bGVtb3MgbGFzIGFyZWFzIGRlIGxvcyBiYXJyaW9zCgpgYGB7cn0KYmFycmlvcwpiYXJyaW9zMiA8LSBiYXJyaW9zICU+JSBtdXRhdGUoQVJFQT1zdF9hcmVhKGJhcnJpb3MpKSAlPiUgYXJyYW5nZSgtQVJFQSkjIGFncmVnbyBlbCBhcmVhCmBgYAoKRGlzdGFuY2lhIGVudHJlIGJhcnJpb3MKCmBgYHtyfQpiYXJyaW9zMgoKc3RfZGlzdGFuY2UoYmFycmlvc1tiYXJyaW9zJEJBUlJJTz09IkJFTEdSQU5PIixdLGJhcnJpb3NbYmFycmlvcyRCQVJSSU89PSJGTE9SRVMiLF0pCnN0X2Rpc3RhbmNlKGJhcnJpb3NbYmFycmlvcyRCQVJSSU89PSJDQUJBTExJVE8iLF0sYmFycmlvc1tiYXJyaW9zJEJBUlJJTz09IkZMT1JFUyIsXSkKZGlzdGFuPC1zdF9uZWFyZXN0X3BvaW50cyhiYXJyaW9zW2JhcnJpb3MkQkFSUklPPT0iQkVMR1JBTk8iLF0sYmFycmlvc1tiYXJyaW9zJEJBUlJJTz09IkZMT1JFUyIsXSkKZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSBiYXJyaW9zLCBhbHBoYSA9IDAuNSkgKyBnZW9tX3NmKGRhdGEgPSBiYXJyaW9zW2JhcnJpb3MkQkFSUklPPT0iRkxPUkVTIixdLCBhZXMoZmlsbCA9IEJBUlJJTykpICsgZ2VvbV9zZihkYXRhID0gYmFycmlvc1tiYXJyaW9zJEJBUlJJTz09IkJFTEdSQU5PIixdLCBhZXMoZmlsbCA9IEJBUlJJTykpICsgZ2VvbV9zZihkYXRhPWRpc3Rhbixjb2w9ImJsdWUiKQpgYGAKCgpBbmFsaXNpcyBkZSBFc3BhY2lvIFZlcmRlIFB1YmxpY28KCmBgYHtyfQojIGNhcmdvIGVsIHNoYXBlIGRlIGNhbGxlcyBkZSBDQUJBCnZlcmRlLmNvbXAgPC0gc3RfcmVhZCgiL2hvbWUvYW5kcmVzZmFyYWwvRHJvcGJveC9Fc3RhZGlzdGljYSBFc3BhY2lhbC9lc3BhY2lvLXZlcmRlLXB1YmxpY28vIikKdmVyZGU8LXZlcmRlLmNvbXBbLCJub21icmUiXSAlPiUgbXV0YXRlKEFyZWFWZXJkZT1zdF9hcmVhKHZlcmRlLmNvbXApKQojIGdyYWZpY28gY29uIGxlYWZsZXQKbGVhZmxldCh2ZXJkZSkgJT4lIGFkZFRpbGVzKCkgJT4lIGFkZFBvbHlnb25zKCkKIwpsZWFmbGV0KHZlcmRlLmNvbXBbdmVyZGUuY29tcCRCQVJSSU89PSJCT0NBIixdKSAlPiUgYWRkVGlsZXMoKSAlPiUgYWRkUG9seWdvbnMoKQoKYGBgCgpDdWFsIGVzIGVsIGJhcnJpbyBjb24gbWFzIEVzcGFjaW8gVmVyZGUgPwoKYGBge3J9CmxlYWZsZXQoKSAlPiUgYWRkVGlsZXMoKSAlPiUgYWRkUG9seWdvbnMoZGF0YT1iYXJyaW9zKSAlPiUgYWRkUG9seWdvbnMoZGF0YT12ZXJkZSxjb2xvciA9ICJncmVlbiIpCmludGVyX2JhX3ZlPC1zdF9pbnRlcnNlY3Rpb24oYmFycmlvczIsdmVyZGUpCnBsb3QoaW50ZXJfYmFfdmVbLCJBcmVhVmVyZGUiXSkKVGFibGFWZXJkZTwtaW50ZXJfYmFfdmUgJT4lIGdyb3VwX2J5KEJBUlJJTykgJT4lIHN1bW1hcmlzZShBcmVhVmVyZGU9c3VtKEFyZWFWZXJkZSksQXJlYVRvdGFsPWZpcnN0KEFSRUEpKSAlPiUgbXV0YXRlKFByb3BWZXJkZT1hcy5udW1lcmljKEFyZWFWZXJkZS9BcmVhVG90YWwpKQojCmdncGxvdChkYXRhPVRhYmxhVmVyZGUsIGFlcyh4PUJBUlJJTywgeT1Qcm9wVmVyZGUpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpICsgY29vcmRfZmxpcCgpCnBsb3QoMSwxKQpgYGAKCgpFc3RhY2lvbmVzIGRlIFN1YnRlCgpgYGB7cn0Kc3VidGVzPC0gcmVhZF9jc3YoIi9ob21lL2FuZHJlc2ZhcmFsL0Ryb3Bib3gvRXN0YWRpc3RpY2EgRXNwYWNpYWwvYm9jYXMtZGUtc3VidGUuY3N2IikgJT4lIHJlbmFtZShsb249bG9uZykKc3VidGVzLnNmIDwtIHN1YnRlcyAlPiUgc3RfYXNfc2YoY29vcmRzID0gYygibG9uIiwgImxhdCIpLCBjcnMgPSA0MzI2KQpzdWJ0ZXMuc2YKbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JSBhZGRDaXJjbGVzKGRhdGE9c3VidGVzLnNmKQpgYGAKCkNhbGN1bGVtb3MgbGEgZGlzdGFuY2lhIGRlIGNhZGEgZGVwdG8gYSBsYSBlc3RhY2lvbiBkZSBzdWJ0ZSBtYXMgY2VyY2FuYQoKYGBge3J9CnJlcXVpcmUobm5nZW8pCmNlcmNhbm9zPC1zdF9ubihkZXB0b3Muc2Ysc3VidGVzLnNmLGs9MSxzcGFyc2UgPSBUUlVFLHJldHVybkRpc3QgPSBUUlVFKQpkaXN0YW5jaWFzPC1hcy5udW1lcmljKGNlcmNhbm9zJGRpc3QpCmxlbmd0aChkaXN0YW5jaWFzKQpgYGAKCiMjIyBNb2VsYWRvIGRlbCBwcmVjaW8gZGUgbG9zIERlcGFlcnRhbWVudG9zCgpNb2VsbyBsaW5lYWwgYmFzaWNvCgpgYGB7cn0KcGxvdChkZXB0b3Muc2Ykc3VwLGRlcHRvcy5zZiRwcmVjaW8seGxpbT1jKDAsNTAwKSx5bGltPWMoMCwyZTYpKQpzZWdtZW50cygxMCwwLDAsMjAwMDAwMCkKaGlzdChkZXB0b3Muc2YkcHJlY2lvKQphanVzPC1sbShwcmVjaW9+c3VwK3Jvb21zLGRhdGE9ZGVwdG9zLnNmKQpzdW1tYXJ5KGFqdXMpCmBgYAoK